namespace test_one {

    // interface 声明类型

    // 题目1：用户信息接口
    // 定义一个接口 User 来描述用户的信息，包括 id（数字类型），username（字符串类型），email（字符串类型），
    // 和 isActive（布尔类型）。使用这个接口创建一个用户对象，并输出用户的用户名。
    interface User {
        id: number
        username: string
        email: string
        isActive: boolean
    }
    let user: User = {
        id: 1,
        username: 'lwj',
        email: '123@qq.com',
        isActive: true
    }
    console.log(user.username); // lwj


    // 题目2； 可选属性的接口
    // 定义一个接口 Product 来描述商品的信息，包括 name（字符串类型），price（数字类型），
    // description（可选的字符串类型）。创建一个实现该接口的商品对象，并输出该商品的所有属性
    interface Product {
        name: string
        price: number
        description?: string
    }
    let producrObj: Product = {
        name: '话梅糖',
        price: 5,
    }
    console.log(producrObj); // { name: '话梅糖', price: 5 }
    console.log(producrObj.name); // 话梅糖
    console.log(producrObj.price); // 5
    console.log(producrObj.description); // undefined


    // 题目3， 函数类型接口
    // 定义一个接口 MathOperation 来描述一个接收两个数字参数并返回数字的函数类型。
    // 使用这个接口定义一个实现加法运算的函数，并调用该函数计算 5 和 3 的和。
    interface MathOperation {
        (x: number, y: number): number
    }

    let add: MathOperation = (a: number, b: number) => {
        return a + b
    }

    console.log(add(5, 3)); // 8

    // 题目 4:数组类型接口
    // 定义一个接口 StringArray 来描述一个由字符串组成的数组。
    // 使用这个接口声明一个字符串数组，并添加一些元素，然后遍历数组输出每个元素。
    interface StringArray extends Array<string> { }
    let stringArr: StringArray = ['lq', 'love', 'lwj']
    stringArr.forEach(name => console.log(name));

    // 你可以直接使用类型注解来约束数组只包含字符串  
    let stringArr2: string[] = ['lq', 'love', 'lwj'];
    // 遍历数组并输出每个元素  
    stringArr2.forEach(name => console.log(name));


    // 题目 5: 只读属性接口
    // 定义一个接口 Coordinates，其中包含只读属性 x 和 y（均为数字类型）。
    // 创建一个实现该接口的对象，并尝试修改 x 或 y 的值，观察 TypeScript 如何处理。
    interface Coordinates {
        readonly x: number
        readonly y: number
    }
    let obj: Coordinates = {
        x: 2,
        y: 3
    }
    console.log(obj); // { x: 2, y: 3 }
    // obj.x = 3 // 无法为“x”赋值，因为它是只读属性。




    // 题目 6: 混合类型接口

    // 定义一个接口 Counter，该接口既可以作为一个数字类型的属性 value，也可以作为一个函数（返回数字类型）。
    // 使用这个接口创建一个计数器对象，并实现相应的功能。

    interface Counter {
        value: number
        (): number
    }
    let counter: Counter = (() => {
        let count = 0;
        const c = () => ++count; // 为什么这里不能用 let，要用 const？
        c.value = 0;
        return c
    })();

    console.log(counter.value); // 0
    console.log(counter()); // 1



    // 题目 7： 索引签名接口
    // 定义一个接口 StringDictionary，该接口表示一个键为字符串，值为字符串的字典。创建一个实现该接口的对象，并向字典中添加一些键值对，然后输出字典的内容。

    interface StringDictionary {
        [key: string]: string;
    }

    const dictionary: StringDictionary = {
        hello: '你好',
        world: '世界',
    };


    console.log(dictionary.hello); // 你好
    console.log(dictionary.world); // 世界

    // StringDictionary 接口定义了一个键为字符串，值为字符串的字典。我们创建了一个字典对象 dictionary 并向其中添加了一些键值对，然后输出了字典内容。


    // 题目 8：接口继承

    // 定义一个接口 Animal，包括 name（字符串类型）和 age（数字类型）属性。然后定义一个接口 Dog，继承自 Animal 并增加 breed（字符串类型）属性。创建一个实现 Dog 接口的对象。

    interface Animal {
        name: string
        age: number

    }

    interface Dog extends Animal {
        breed: string

    }

    const myDog: Dog = {
        name: '志超',
        age: 22,
        breed: 'sad'
    }

    console.log(myDog.name); // 志超
    console.log(myDog.age); // 22
    console.log(myDog.breed); // sad


    // Dog 接口继承自 Animal 接口，并增加了 breed 属性。我们创建了一个 myDog 对象，符合 Dog 接口的定义。




    // 题目 9: 接口合并

    // 定义两个接口 Person 和 Employee，Person 包含 name（字符串类型）和 age（数字类型），Employee 包含 employeeId（数字类型）。使用接口合并将两者合并为一个 Worker 接口，并创建一个符合 Worker 接口的对象

    interface Person {
        name: string
        age: number
    }

    interface Employee {
        employeeId: number
    }

    interface Worker extends Person, Employee { }

    const work: Worker = {
        name: '长生',
        age: 21,
        employeeId: 143542645
    }
    console.log(work.name); // 长生
    console.log(work.age); // 21
    console.log(work.employeeId); // 143542645



}